/************************************************************************
** 文  件：
**	TextUtil.h
** 功  能：
**	文本处理工具类：提供系统文本操作相关处理封装
** 作  者：
**	email:lixx2048@163.com
**  wechat:lixiang6153
**  QQ:941415509
** 日  期：
**	2024/03/15	14:00:00
** 说  明：
**	无
** 版  本：
**	2024/03/15	14:00:00		1.0		lixx2048@163.com
/************************************************************************/
#pragma once
#include <string>
#include <set>
#include <vector>
#include <sstream>
#include <boost/serialization/singleton.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/filesystem.hpp>
#include <boost/uuid/nil_generator.hpp>
#include <boost/uuid/random_generator.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
#ifdef WIN32
#include <windows.h>
#else
#include <sys/time.h>
#include <iconv.h>
#endif

class TextUtil
	: public boost::serialization::singleton<TextUtil>
{
public:
	TextUtil();
	virtual ~TextUtil();

public:
	// 生成随机UUID
	std::string GetGuid();
	// 字符串文本替换
	std::string ReplaceAll(std::string& str, const std::string& old_value, const std::string& new_value);
	// 获取指定长度随机数字字符串
	std::string GetRandomDigitString(int length);
	// 获取时间随机长度
	std::string GetTicketTimeString(int random);
	// 获取指定长度随机字母字符串
	std::string GetRandomAsciiString(int length, bool allowStartByDigit);
	// 格式化json,剔除转义字符
	std::string FormatJson(std::string json);
	// 转换为小写
	std::string ToLowerCase(std::string source);
	// 转换为大写
	std::string ToUpperCase(std::string source);
	// 截取相对路径-排除前面相同的路径，剩下的子目录
	std::string GetRelativePath(std::string source, std::string directory);
	// Ascii转Unicode
	std::wstring Utf82Unicode(const char* source, int code_page = 0);
	// Unicode转UTF8
	std::string Unicode2UTF8(const wchar_t* source, int code_page = 65001);
	// Ascii转UTF8
	std::string Ascii2Utf8(std::string source);
	std::string Ascii2Utf8(const char* source);
	// UTF8转Ascii
	std::string Utf82Ascii(std::string source);
	std::string Utf82Ascii(const char* source);
	// 字符串分隔
	std::vector<std::string> SplitString(std::string str, char delimiter = ',');
	// 字符在数据中
	bool ContainString(std::vector<std::string>& list, std::string item);
	// 字符串连接
	std::string JoinString(std::vector<std::string>& list, std::string delimiter = ",");
	// 字符串连接
	std::string JoinString(std::set<std::string>& list, std::string delimiter = ",");
	// 字符串以xx开头
	bool StartWith(const std::string& str, const std::string& head);
	// 字符串以xx结尾
	bool EndWith(const std::string& str, const std::string& tail);
	// 通过RTSP地址获取IP
	std::string GetIpFromRtspUrl(std::string input);
	// 通过RTSP地址获取IP和端口
	std::string GetIpFromRtspUrl(std::string input, int& port);
	// 通过ws地址获取ip和端口
	std::string GetIpFromWsUrl(std::string input, std::string& ip, int& port);
	// 删除字符前后空格
	std::string Trim(std::string source);
	// 获取令牌信息
	std::string GetToken(std::string authorization);
	// URL编码
	std::string UrlEncode(const char* str);
	// URL解码
	std::string UrlDecode(const char* str);
	// 是否数字
	bool IsDigit(std::string source);
	// 是否整数
	bool IsInteger(std::string source);
};